#ifndef DATO_H_
#define DATO_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "PrimaryKey.h"
#include "../enums/TipoSerializacion.h"

using namespace std;
class Dato{
    private:
        void reverse(char s[]);
        
	protected:
		unsigned int tamanioTexto;
		unsigned int tamanioBinario;

	public:
		
		/**
		 * @author emilio
		 * @return unsigned int tamanio 
		 * @version 
		 */
		virtual unsigned int getTamanio(TipoSerializacion modo)=0;
		
		/**
		 * Comparador con clave primaria.
		 * 
		 * @author emilio
		 * @param Dato* datoAComparar
		 * @return bool 
		 * @version 
		 */
		virtual int compareTo(Dato *datoAComparar)=0;
		
		/**
		 * Comparador por lista de campos. En la version siguiente se va a cambiar
		 * el array dinamico de strings por un vector. El orden de los campos debe
		 * ser descendente por prioridad.
		 * 
		 * @author emilio
		 * @param Dato* datoAComparar
		 * @param char** camposAComparar
		 * @param int cantCamposAComparar
		 * @return bool 
		 * @version 
		 */
		virtual int compareToWith(Dato *datoAComparar, char** camposAComparar, int cantCamposAComparar)=0;
		
		/**
		 * @author emilio
		 * @param void* datoSerializado
		 * @param TipoSerializacion modo 
		 * @return void* dato
		 * @version 
		 */
		virtual void serialize(void **datoSerializado, TipoSerializacion modo)=0;
		
		/**
		 * @author emilio
		 * @param TipoSerializacion modo
		 * @return void* dato
		 * @version 
		 */
		virtual void unserialize(void *datoADeserializar, TipoSerializacion modo)=0;
		
		/**
		 * @author emilio
		 * @param TipoSerializacion modo
		 * @return Dato* clon
		 * @version 
		 */
        virtual void clone(Dato* clon)=0;
		
		void intToString(int n, char s[]);
		
		int stringToInt(char s[]);
		
		void floatToString(float n, char s[]);
		
		float stringToFloat(char s[]);
        
        char boolToChar(bool b);
        
        bool charToBool(char c);
	};

#endif /*DATO_H_*/
